﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NHibernate;
using CRC.Incidencias.Dominio.Clases;
using CRC.GestionSalones.Controladores;
using CRC.GestionSalones.Dominio.Clases;

namespace CRC.Incidencias.Dominio.Controladores
{
    public class ControladorGestionDeIncidencias
    {
        private static String strQryIncidenciasPorSalon = "from Incidencia inc where inc.Salon.Id=:idSalon order by inc.Id desc";
        private ControladorListarSalones cLS = new ControladorListarSalones();

        private Salon salon = null;

        public IList<Object[]> listarSalonesLigeros()
        {
            return this.cLS.listarSalonesLigeros();
        }

        public IList<Object[]> listarIncidencias(int pIntSalon)
        {
            ISession session = null;
            IList<Object[]> res = new List<Object[]>();

            try
            {
                session = CRC.NHibernate.NHibernateHelper.GetCurrentSession();
                
                this.salon = (Salon)session.Get(typeof(Salon), pIntSalon);
                
                IQuery qry = session.CreateQuery(strQryIncidenciasPorSalon).SetParameter("idSalon", pIntSalon);
                IList<Incidencia> incidencias = qry.List<Incidencia>();

                if (incidencias.Count == 0) throw new ApplicationException("No hay incidencias.");

                foreach(Incidencia inc in incidencias)
                {
                    Object[] infoInc = new Object[5];
                    infoInc[0] = inc.Id;
                    infoInc[1] = inc.AfectaA.Codigo;
                    infoInc[2] = inc.AfectaA.EscribirRuta();
                    if (inc.Observaciones.Length > 100)
                        infoInc[3] = inc.Observaciones.Substring(0, 100) + "...";
                    else
                        infoInc[3] = inc.Observaciones;

                    infoInc[4] = inc.Cerrada;
                    res.Add(infoInc);
                }

                return res;
            }
            catch (HibernateException ex)
            {
                if (session != null) session.Close();
                throw ex;
            }
        }

        private static String strQryQuienAtiendeIncidencia = "select asi.Id, asi.Descripcion from AsignacionIncidencia asi order by asi.Descripcion";

        public IList<Object[]> ListaQuienAtenderaIncidencias()
        {
            ISession session = null;
            ITransaction tx = null;
            IList<Object[]> quienAtiendeIncidencias;

            try
            {
                session = CRC.NHibernate.NHibernateHelper.GetCurrentSession();
                quienAtiendeIncidencias = session.CreateQuery(strQryQuienAtiendeIncidencia).List<Object[]>();
                return quienAtiendeIncidencias;

            }
            catch (HibernateException he)
            {
                if (tx != null)
                {
                    tx.Rollback();
                    session.Close();
                }
                throw he;
            }
        }

        public int notificarIncidencia(
            String pStrConcepto,
            int pLoSoluciona,
            DateTime pFechaLimite,
            String pStrObservaciones
        )
        {
            ISession session = null;
            ITransaction tx = null;
            try
            {
                session = CRC.NHibernate.NHibernateHelper.GetCurrentSession();
                tx = session.BeginTransaction();

                Concepto conc = (Concepto)session.Get(typeof(Concepto), pStrConcepto);
                AsignacionIncidencia aAtenderPor = (AsignacionIncidencia)session.Get(typeof(AsignacionIncidencia), pLoSoluciona);

                Incidencia nuevaIncidencia = new Incidencia(salon, conc, aAtenderPor, pFechaLimite, pStrObservaciones);

                session.Save(nuevaIncidencia);
                tx.Commit();

                return nuevaIncidencia.Id;
            }
            catch (HibernateException he)
            {
                if (tx != null) tx.Rollback();
                session.Close();
                throw he;
            }
        }

    }
}
